import axios from 'axios';
import type { AxiosInstance, AxiosResponse, AxiosError } from 'axios';
import { useUserStore } from '@/stores/user';

// 定义API响应的通用格式
export interface ApiResponse<T = unknown> {
  success: boolean;
  message: string;
  code: number;
  result: T;
  timestamp: string;
}

// 创建 axios 实例
const apiClient: AxiosInstance = axios.create({
    baseURL: 'http://localhost:8088', // 后端 API 基础 URL
    timeout: 30000, // 请求超时时间，单位毫秒
    headers: {
        'Content-Type': 'application/json;charset=UTF-8' // 默认请求头
    }
});

// 请求拦截器
apiClient.interceptors.request.use(
    (config) => {
        // 在发送请求之前可以做一些处理，例如添加 token
        const token: string | null = localStorage.getItem('token');
        if (token && config.headers) {
            config.headers['x-access-token'] = token; // 使用 x-access-token 头来传递 token
        }
        return config;
    },
    (error: AxiosError) => {
        // 请求错误处理
        return Promise.reject(error);
    }
);

// 响应拦截器
apiClient.interceptors.response.use(
    (response: AxiosResponse) => {
        // 响应成功处理 - 直接返回 response，让业务代码自己处理 data
        return response;
    },
    (error: AxiosError) => {
        // 响应错误处理
        if (error.response) {
            const status: number = error.response.status;
            const data = error.response.data as ApiResponse;
            
            // 只有当后端明确返回 401 状态码时才认为是登录过期
            // 移除对 data.code 的检查，因为这可能导致误判
            if (status === 401) {
                // 未授权，token过期或无效
                const userStore = useUserStore();
                userStore.clearUserInfo();
                
                // 显示token过期提示
                alert('登录已过期，请重新登录');
                
                // 跳转到登录页面
                window.location.href = '/login';
                return Promise.reject(new Error('登录已过期'));
            } else {
                // 其他错误状态码处理
                const errorMessage = data?.message || `请求失败 (${status})`;
                console.error('API Error:', errorMessage);
                return Promise.reject(new Error(errorMessage));
            }
        } else if (error.request) {
            // 请求已发出，但没有收到响应
            console.error('No response received:', error.request);
            return Promise.reject(new Error('网络错误，请检查网络连接'));
        } else {
            // 其他错误
            console.error('Error:', error.message);
            return Promise.reject(new Error(error.message || '请求失败'));
        }
    }
);

// 导出封装好的 axios 实例
export default apiClient;